#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
    int arr[] = {1, 2, 3};
    int *p;
    // malloc返回值为void*，需要强制转换为对应类型的指针
    // void* malloc(size_t size)
    // 它接受一个非负整数作为参数，表示所要分配的内存字节数，返回一个 void 指针
    p = (int *)malloc(3 * sizeof(int));
    // 返回值为NULL表示申请失败
    if (p == NULL)
    {
        printf("Memory allocation failed\n");
    }
    for (int i = 0; i < 3; i++)
    {
        p[i] = arr[i];
    }
    for (int i = 0; i < 3; i++)
    {
        printf("%d\n", p[i]);
    }
    // 释放的一定是有效的申请过的地址
    // 分配的内存块一旦释放，就不应该再次操作已经释放的地址，也不应该再次使用free()对该地址释放第二次
    // free(p+1); // 这样写是错误的
    free(p);

    char *str_p = malloc(4);
    strcpy(str_p, "abc");
    printf("%s\n", str_p);
    free(str_p);
}